package main

import "fmt"

/**
	面向对象只支持封装  不支持继承和多态
	go中没有class 只有struct
	使用.来访问成员

	值接收者 vs指针接收者
	要改变内容必须使用指针接收者
	结构过大也考虑使用指针接受者
	一致性：如有指针接收者，最好都是指针接收者

	值接收者是go特有的

 */

type treeNode struct {
	value int
	left, right *treeNode
}

//结构的方法
func (node treeNode) print()  {
	 fmt.Println(node.value)
}
//需要取地址才可以修改原参数，因为是值传递
func (node *treeNode) setValue(value int) {
	if node == nil {
		fmt.Println("set node is nil")
		return
	}
	node.value = value
}
//工厂函数
func createTreeNode(value int) *treeNode {
	return &treeNode{value: value}
}

func main()  {
	//struct 的创建
	//var root treeNode
	root := treeNode{}
	fmt.Println(root)
	root = treeNode{value: 3}
	root.left = &treeNode{}
	root.right = &treeNode{4,nil,nil}
	root.right.left = new(treeNode)
	nodes := []treeNode{
		{value: 4},
		{},
		{5,nil,&root},
	}
	root.left.right = createTreeNode(2)
	fmt.Println(nodes)
	fmt.Println(root)
	fmt.Println()
	root.print()
	root.setValue(5)
	root.print()
	root.traverse()
	//var pRoot  *treeNode
	//fmt.Println(pRoot)
	//pRoot.setValue(300)
	//pRoot = &root
	//pRoot.setValue(400)
	//pRoot.print()
}

func (node *treeNode) traverse()  {
	if node == nil{
		return
	}
	node.left.traverse()
	node.print()
	node.right.traverse()
}